from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from product.models import Product
from Apis.serializers import ProductModelSerializer

from rest_framework.pagination import LimitOffsetPagination

# 偏移量计算公式：offset = (page - 1) * limit     limit是每页显示的记录数，page是页码
# 页码计算公式：page = (offset / limit) + 1

# 每页显示10条记录
# 第一页：offset = 0，limit = 10，page = 1，offset = (1 - 1) * 10 = 0
# 第二页：offset = 10，limit = 10，page = 2，offset = (2 - 1) * 10 = 10
# 第三页：offset = 20，limit = 10，page = 3，offset = (3 - 1) * 10 = 20
# 第四页：offset = 30，limit = 10，page = 4

# 自定义limit和offset分页器类，继承自LimitOffsetPagination
class CustomLimitOffsetPagination(LimitOffsetPagination):
    # 默认每页显示的记录数
    default_limit = 10
    # 指定最大每页显示的记录数
    max_limit = 20
    # 指定分页器的查询参数名称
    limit_query_param = "limit"
    # 指定每页显示的记录数的查询参数名称
    offset_query_param = "offset"
    def get_paginated_response(self, data):
        return Response({
            'code': 'success',
            'message':'请求成功',
            'data':{'data':data,
                    'count':self.count,  
                    'next':self.get_next_link(),
                    'previous':self.get_previous_link(),
                    'has_next':self.get_next_link() is not None,
                    'has_previous':self.get_previous_link() is not None,
                    } 
        })
    
# page=1&size=10
# limit=10&offset=20 从第21条开始往后取10条数据
class ProductGAPIView(GenericAPIView):
    # 定义属性
    queryset = Product.objects.all()  # 接收的是查询之后的数据
    # 接收的是序列化器类，用于序列化和反序列化数据。
    serializer_class = ProductModelSerializer
    # 分页
    pagination_class = CustomLimitOffsetPagination 
    
    
    def get(self,request,*args,**kwargs):
        # 获取全部数据
        product = self.get_queryset()  # 调用get_queryset方法，获取查询之后的数据。
        paginator = self.pagination_class()  # 调用pagination_class方法，获取分页器类。
        page = paginator.paginate_queryset(product,request)  # 调用paginate_queryset方法，获取分页之后的数据。
        # 判断是否有分页数据
        if page is not None:
            ser = self.get_serializer(page,many=True)  # 调用get_serializer方法，获取序列化器类。
            return paginator.get_paginated_response(ser.data)  # 调用get_paginated_response方法，获取分页之后的数据。 
        ser = self.get_serializer(product,many=True)  # 调用get_serializer方法，获取序列化器类。
        return Response({"message":"ok","data":ser.data},status=200)
    
    def post(self,request,*args,**kwargs):
        # 接收前端数据并反序列化
        ser = self.get_serializer(data=request.data) 
        # 验证数据
        if ser.is_valid(raise_exception=True): 
            ser.save()  
            return Response({"message":"ok","data":ser.data},status=201)
    
class ProductGdetailAPIView(GenericAPIView):
    # 定义属性
    queryset = Product.objects.all()  # 接收的是查询之后的数据
    # 接收的是序列化器类，用于序列化和反序列化数据。
    serializer_class = ProductModelSerializer
    
    def get(self,request,*args,**kwargs):
        # 获取指定数据
        product = self.get_object()  # 调用get_object方法，获取查询之后的数据。
        ser = self.get_serializer(product)  # 调用get_serializer方法，获取序列化器类。
        return Response({"message":"ok","data":ser.data},status=200)
    
    def put(self,request,*args,**kwargs):
        # 获取要修改的对象
        product = self.get_object()  
        # 接收前端数据并反序列化
        ser = self.get_serializer(product,data=request.data) 
        # 验证数据
        if ser.is_valid(raise_exception=True):
            ser.save()
            return Response({"message":"ok","data":ser.data},status=200)
        
    def delete(self,request,*args,**kwargs):
        # 获取要删除的对象
        product = self.get_object()
        # 删除数据
        product.delete()
        return Response({"message":"ok"},status=204)